import java.util.Arrays;//

public class Array {

    public static void Func(int[] arr1) {
        for(int i = 0; i < arr1.length; i++) {
            arr1[i]=arr1[i]*2;
        }
    }

    //在C++中，数组是不能作为返回值的，但是在java中可以
    public static int[] Func2(int[] arr) {
        int[] tmp=new int[arr.length];
        for(int i=0;i<arr.length;i++) {
            tmp[i]=arr[i]*2;
        }
        return tmp;
    }

    public static String myToString(int[] array) {

        //若字符串为null
        if(array==null){
            return "null";
        }
        //若字符串为空
        if(array.length==0) {
            return "[]";
        }

        String ret="[";
        for(int i=0;i<array.length;i++) {
            ret=ret+array[i];
            if(i!=array.length-1)ret+=",";
        }
        ret+="]";
        return ret;
    }

    /**
     *
     * @param arr
     * @param key
     * @return 找到的话返回当前数据的下标，没有找到返回-1
     */
    public static int findNum(int[] arr,int key) {
        for(int i=0;i<arr.length;i++) {
            if(arr[i]==key)return i;
        }
        return -1;
    }

    public static int binarySearch(int[] arr,int key) {
        int left=0;
        int right=arr.length-1;
        while(left<=right) {
            //int mid=(left+right)/2;
            int mid=left+((right-left)>>>1);//这样写可以防止在right和left都很大时，两者之和超过了最大范围
            if(arr[mid]<key) {
                left=mid+1;
            }else if (arr[mid]>key) {
                right=mid-1;
            }else {
                return mid;
            }
        }
        return -1;
    }

    //二分查找，建立在你要找的数据是有序的情况下
    public static void main(String[] args) {
        int[] arr={1,2,3,4};
        Arrays.sort(arr);
        //int index=binarySearch(arr,4);
        int index=Array.binarySearch(arr,4);//这个方法是java原生二分查找的方法
        System.out.println(index);
    }

    //顺序查找，但是效果不好
    public static void main7(String[] args) {
        int[] arr={1,2,3,4,5};
        int index=findNum(arr,5);
        System.out.println(index);
    }

    public static void main6(String[] args) {
        int[] arr={1,2,3,4,5};
        String ret=myToString(arr);
        System.out.println(ret);
    }

    public static void main5(String[] args) {

        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]+" ");
        }
        System.out.println();
    }

    public static void main4(String[] args) {
        int[] array={1,2,3,4,5};
        int[]retArray=Func2(array);

        String ret=Arrays.toString(array);
        System.out.println(ret);

        String ret2=Arrays.toString(retArray);
        System.out.println(ret2);
    }

    public static void main3(String[] args) {
        int[] arr={1,2,3,4};
        Func(arr);
        String ret=Arrays.toString(arr);
        System.out.println(ret+" ");
    }

    public static void main2(String[] args) {
        //这样写不会报错，但是它相当于多次赋值，最后只会存最后一次赋值的结果
        int[] array= {1, 2, 3, 4};
        array=new int[10];
        array=new int[20];
        array=new int[30];

    }
    public static void main1(String[] args) {
        int[] arr={1,2,3,4};
        for(int i=0;i<arr.length;i++) {
            System.out.println(arr[i]+" ");
        }
        System.out.println();
        //for each 遍历数组 把每个元素 存储到x中
        for(int x:arr) {
            System.out.println(x+" ");
        }

        //借助java原生的方法 将指定的数组 以字符串的形式进行输出
        String ret=Arrays.toString(arr);
        System.out.println(ret);
    }
}
